﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IOPerformanceTest.Utils
{
    /// <summary>
    /// 数据管理器类用于管理采集到的各类数据，提供基本的运算功能。
    /// </summary>
    public class DataManager
    {
        /// <summary>
        /// 所有的数据都保存在这个字典中。
        /// </summary>
        Dictionary<string, List<double>> dic = new Dictionary<string, List<double>>();

        /// <summary>
        /// 将指定的值添加至指定的键中。
        /// </summary>
        /// <param name="key">键。</param>
        /// <param name="value">值。</param>
        public void Add(string key, double value)
        {
            if (!dic.Keys.Contains(key))
                dic.Add(key, new List<double>());
            dic[key].Add(value);
        }

        /// <summary>
        /// 重置所有数据。
        /// </summary>
        public void Reset()
        {
            dic = new Dictionary<string, List<double>>();
        }

        /// <summary>
        /// 获得所有的键，默认升序排列。
        /// </summary>
        /// <returns></returns>
        public List<string> GetKeys()
        {
            List<string> keys = new List<string>();
            keys.AddRange(dic.Keys);
            keys.Sort();
            return keys;
        }

        /// <summary>
        /// 获得指定键的中位数。
        /// </summary>
        /// <param name="key">键。</param>
        /// <returns></returns>
        public double GetMedian(string key)
        {
            List<double> list = new List<double>();
            list.AddRange(dic[key].ToList());
            list.Sort();
            return list[list.Count / 2];
        }

        /// <summary>
        /// 获得平均值。
        /// </summary>
        /// <param name="key">键。</param>
        /// <returns></returns>
        public double GetAverage(string key)
        {
            return dic.Keys.Contains(key) ? dic[key].Average() : 0;
        }

        /// <summary>
        /// 获得指定键的全部值。
        /// </summary>
        /// <param name="key">键。</param>
        /// <returns></returns>
        public List<double> GetValues(string key)
        {
            return dic.Keys.Contains(key) ? dic[key].ToList() : new List<double>();
        }

        /// <summary>
        /// 获得指定键的平均值。
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public double GetAverage1(string key)
        {
            if (!dic.Keys.Contains(key))
                return 0;
            double[] values = dic[key].ToArray();
            if (values.Length < 3)
                return dic[key].Average();
            double r = 0;
            for (int i = 2; i < values.Length; i++)
            {
                r += values[i];
            }
            return r / (values.Length - 2);
        }

        /// <summary>
        /// 显示所有数据。
        /// </summary>
        public void Show()
        {
            foreach (string key in GetKeys())
            {
                Console.WriteLine($"{key}\t{string.Join("\t", dic[key].Select(v => v.ToString("0.000")).ToArray())}");
            }
        }
    }
}
